#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include "msgq.h"
#include "tools.h"

Ctos ctos;
Stoc stoc;


Ctos ctos2;
Stoc stoc2;

void open_acc(void)
{
	char str1[6],str2[6];
	ctos.type = TYPE_OPEN;
	int pass1,pass2;
	pf("请输入姓名：");
	get_str(ctos.acc.name,20);
	pf("请输入身份证号:");
	get_str(ctos.acc.card,19);
	pf("请设置您的密码: ");
	get_passwd(str1,true,8);
	pass1 = ch_pass_in(str1);
	printf("请再次输入密码：");
	clear_stdin();
	get_passwd(str2,true,8);
	pass2 = ch_pass_in(str2);
	clear_stdin();
	if(pass1 == pass2)
	{
		ctos.acc.pass = pass1;
		ctos_send(&ctos);//发送
		stoc_recv(&stoc,ctos.pid);//接收
		pf("server:%s\n",stoc.str);
		//任意键继续
		anykey_continue();
	}
	else
	{
		printf("开户失败！\n");
		//任意键继续
		anykey_continue();
	}
}

void login(void)
{
	char str[6];
	ctos.type = TYPE_LOGIN;
	pf("请输入卡号：");
	sf("%d",&ctos.acc.id);
	clear_stdin();
	pf("请输入密码：");
	get_passwd(str,true,8);
	ctos.acc.pass = ch_pass_in(str);
	ctos_send(&ctos);//发送消息
	stoc_recv(&stoc,ctos.pid);//接收
	int pas = ch_pass_in(stoc.str);
	if (ctos.acc.pass == pas)
	{
		printf("登录成功！正在加载中。。。\n");
		sleep(3);
		sub_menu(ctos.acc.id);//登录成功
	}
	else
	{
		pf("%s\n",stoc.str);
		//任意键继续
		anykey_continue();
	}

}

void destory(void)
{
	char str1[6];
	int pass1;
	ctos.type = TYPE_DESTORY;
	pf("请输入卡号：");
	sf("%d",&ctos.acc.id);
	clear_stdin();
	
	char c;	
	while(c!='n'&&c!='N')
	{
		printf("请确认是否销户(Y/N):");
		c = getchar();
		if('N'==c||'n'==c) break;
		else if(c!='Y'&&c!='y')
		{
			printf("请重新输入！\n");
			anykey_continue();
			continue;			
		}
		clear_stdin();
		pf("请输入您的密码: ");
		get_passwd(str1,true,8);
		pass1 = ch_pass_in(str1);
			ctos.acc.pass = pass1;
			ctos_send(&ctos);//发送
			
			
			stoc_recv(&stoc,ctos.pid);//接收
			pf("server:%s\n",stoc.str);
			//任意键继续
			anykey_continue();
			break;
	}
}

void unlock(void)
{
	char str[6];
	ctos.type = TYPE_UNLOCK;
	pf("请输入卡号：");
	sf("%d",&ctos.acc.id);
	clear_stdin();
	pf("请输入管理员密码：");
	get_passwd(str,true,8);
	int a_pass = ch_pass_in(str);
	if(a_pass != A_PASSWORD)
	{
		printf("管理员密码验证失败!\n");
		//任意键继续
		anykey_continue();
	}
	else
	{
		char str1[6],str2[6];
		int pass1,pass2;
		pf("管理员验证成功！\n");
		while(true)
		{
			printf("请设置新密码: ");
			get_passwd(str1,true,8);;
			pass1 = ch_pass_in(str1);
			printf("请再次输入新密码：");
			clear_stdin();
			get_passwd(str2,true,8);;
			pass2 = ch_pass_in(str2);
			if(pass1 == pass2)
			{	
				ctos.acc.pass = pass1;
				ctos_send(&ctos);//发送消息
				stoc_recv(&stoc,ctos.pid);//接收;
				pf("%s\n",stoc.str);
				//任意键继续
				anykey_continue();
			}
			else
			{
				printf("两次密码不一致!\n");
				continue;
			}
			break;
		}
	}	
}

void save(int id)
{
	ctos.type = TYPE_SAVE;
	ctos.acc.id = id;
	printf("请输入存钱金额:");
	scanf("%f",&ctos.acc.money);
	clear_stdin();
	ctos_send(&ctos);//发送消息
	printf("存钱中。。。\n");
	sleep(3);
	stoc_recv(&stoc,ctos.pid);//接收;
	pf("%s\n",stoc.str);
	anykey_continue();
	
}

void take(int id)
{
	ctos.type = TYPE_TAKE;
	ctos.acc.id = id;
	printf("请输入取钱金额:");
	scanf("%f",&ctos.acc.money);
	clear_stdin();
	ctos_send(&ctos);//发送消息
	printf("取钱中。。。\n");
	sleep(3);
	stoc_recv(&stoc,ctos.pid);//接收;
	pf("%s\n",stoc.str);
	anykey_continue();
}

void transf(int id)
{
	
	ctos.type = TYPE_TRANSF;
	ctos2.type = TYPE_TRANSF_TWO;
	ctos.acc.id = id;
	pf("请输入要转入账户卡号：");
	sf("%d",&ctos2.acc.id);
	clear_stdin();
	printf("请输入转入金额:");
	scanf("%f",&ctos.acc.money);
	ctos2.acc.money = ctos.acc.money;
	clear_stdin();
	ctos_send(&ctos);//发送消息
	//printf("-----1------\n");
	ctos_send(&ctos2);//发送消息
	//printf("-----2------\n");
	stoc_recv(&stoc,ctos.pid);//接收;
	//printf("-----3------\n");
	pf("%s\n",stoc.str);
	//printf("-----4------\n");
	anykey_continue();
	
}

void query(int id)
{
	ctos.type = TYPE_QUERY;
	ctos.acc.id = id;
	ctos_send(&ctos);//发送消息
	printf("查询中。。。\n");
	sleep(3);
	stoc_recv(&stoc,ctos.pid);//接收;
	pf("%s\n",stoc.str);
	anykey_continue();
}

void main_menu()
{
	for(;;)
	{
		system("clear");
		pf("1、开户	2、登录\n");
		pf("3、销户	4、解锁\n");
		switch(get_cmd('1','5'))
		{
			case '1': open_acc(); break;
			case '2': login(); break;
			case '3': destory(); break;
			case '4': unlock(); break;
			case '5': return;
		}
	}
}

void sub_menu(int id)
{
	for(;;)
	{
		system("clear");
		pf("1、存款	2、取款\n");
		pf("3、转账	4、查余	5、返回\n");
		switch(get_cmd('1','5'))
		{
			case '1': save(id); break;
			case '2': take(id); break;
			case '3': transf(id); break;
			case '4': query(id); break;
			case '5': return;
		}
	}
}

int main()
{
	ctos.pid = getpid();
	// 初始化消息队列
	init_msgq();
	// 进入主菜单
	main_menu();
}
